package com.rslai.base.tool.servertest.database;

import com.rslai.base.tool.servertest.database.datatype.TimestampDataType;
import com.rslai.base.tool.servertest.database.postgresql.ArrayDataType;

import java.util.Arrays;
import java.util.Collection;

import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.dataset.datatype.DefaultDataTypeFactory;

public class QunitDataTypeFactory extends DefaultDataTypeFactory {
    private static final DataType[] TYPES = {DataType.VARCHAR, DataType.CHAR, DataType.LONGVARCHAR, DataType.NCHAR, DataType.NVARCHAR, DataType.LONGNVARCHAR, DataType.CLOB, DataType.NUMERIC, DataType.DECIMAL, DataType.BOOLEAN, DataType.BIT, DataType.INTEGER, DataType.TINYINT, DataType.SMALLINT, DataType.BIGINT, DataType.REAL, DataType.DOUBLE, DataType.FLOAT, DataType.DATE, DataType.TIME, DataType.TIMESTAMP, DataType.VARBINARY, DataType.BINARY, DataType.LONGVARBINARY, DataType.BLOB, DataType.BIGINT_AUX_LONG};

    private static final Collection DATABASE_PRODUCTS = Arrays.asList(new String[]{"mysql"});

    public DataType createDataType(int sqlType, String sqlTypeName)
            throws DataTypeException {
        if (sqlType == 93) {
            return TimestampDataType.TYPE;
        }

        DataType dataType = DataType.UNKNOWN;
        if (sqlType != 1111) {
            dataType = forSqlType(sqlType, sqlTypeName);
        } else {
            if ("BLOB".equals(sqlTypeName)) {
                return DataType.BLOB;
            }

            if ("CLOB".equals(sqlTypeName)) {
                return DataType.CLOB;
            }
        }
        return dataType;
    }

    protected DataType forSqlType(int sqlType, String sqlTypeName) throws DataTypeException {
        for (int i = 0; i < TYPES.length; i++) {
            if (sqlType == TYPES[i].getSqlType())
                return TYPES[i];
            if (sqlType == 2003) {
                return new ArrayDataType(sqlTypeName, sqlType);
            }
        }

        return DataType.UNKNOWN;
    }

    public Collection getValidDbProducts() {
        return DATABASE_PRODUCTS;
    }
}
